home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <string.h>
- #include <MacTypes.h>
- #include <Color.h>
- #include <FileMgr.h>
- #include <WindowMgr.h>
- #include <StdFilePkg.h>
-
- Point SFGwhere = { 90, 82 };
- Point SFPwhere = { 106, 104 };
- SFReply reply;
-
- struct ImagineHeader
- {
- char Version[8];
- long OffsetToFirstSlice;
- long SliceBytes;
- short number_of_columns;
- short number_of_rows;
- short number_of_slices;
- short number_of_frames;
- float column_scale;
- float row_scale;
- float slice_scale;
- float frame_scale;
- char column_units[8];
- char row_units[8];
- char slice_units[8];
- char frame_units[8];
- char image_units[8];
- Rect Xsection;
- };
-
- struct ImagineSliceHeader
- {
- long OffsetToFirstSlice;
- float SliceScale;
- };
-
- Boolean GetImageParms(Header, offset, image_type, Uns, Multi)
- struct ImagineHeader* Header;
- long* offset;
- short* image_type;
- Boolean* Uns;
- Boolean* Multi;
- {
- short nogood;
- DialogPtr DPtr;
- short items[3];
- short result;
- short itemhit;
- short soffset;
- GrafPtr saveport;
-
- nogood = true;
- GetPort(&saveport);
- DPtr = GetNewDialog(3796, 0L, -1L);
- items[0] = 7;
- items[1] = 8;
- items[2] = 9;
- Set_button(DPtr, 7, 1);
- DrawDefault(DPtr, 1, 0L);
- do
- {
- ModalDialog(0L, &itemhit);
- switch (itemhit)
- {
- case 7:
- case 8:
- case 9:
- Do_radio_buttons(DPtr, 3, items, itemhit);
- break;
- case 15:
- case 10:
- Toggle_button(DPtr, itemhit);
- break;
- case 2:
- DisposDialog(DPtr);
- SetPort(saveport);
- return(false);
- case 1:
- if( DialogtoShort( DPtr, 3, &(*Header).number_of_rows, 0, 2048) &&
- DialogtoShort( DPtr, 4, &(*Header).number_of_columns, 0, 2048) &&
- DialogtoShort( DPtr, 5, &(*Header).number_of_slices, 0, 2048) &&
- DialogtoShort( DPtr, 6, &soffset, 0, 32000) )
- nogood = false;
- else SysBeep(1);
- break;
- }
- } while (nogood);
-
- *Uns = If_button(DPtr, 10);
- *Multi = If_button(DPtr, 15);
- if( If_button(DPtr, 7) ) *image_type = 0;
- if( If_button(DPtr, 8) ) *image_type = 1;
- if( If_button(DPtr, 9) ) *image_type = 2;
- *offset = soffset;
- DisposDialog(DPtr);
- SetPort(saveport);
- return(true);
- }
-
-
- main()
- {
- short *Data_out;
- unsigned short *Data_in;
- unsigned char *Data_in_char;
- int File_in;
- int File_out;
- int vRef;
- int refNum;
- OSType type;
- Str255 fn;
- short col;
- short row;
- long i;
- long count_in;
- long count_out;
- int rsrc;
- short *scPtr;
- Handle scHandle;
- short slice;
- short image_type;
- long offset;
- Boolean Uns;
- Boolean Multi;
- long BOffset;
- char Blank[1024];
- struct ImagineHeader Header;
- struct ImagineSliceHeader SliceHeader;
-
- InitGraf(&thePort);
- InitFonts();
- FlushEvents( everyEvent, 0 );
- InitWindows();
- InitMenus();
- InitDialogs(0L);
- InitCursor();
-
- if( !GetImageParms(&Header, &offset, &image_type, &Uns, &Multi) ) return;
-
- fn[0] = 0;
- if(!NewFile( &fn, &vRef )) return;
- if(!CreateFile( &fn, &vRef, &File_out)) {SysBeep(1); return;}
- SetVol( 0L, vRef );
-
- strcpy(Header.Version, "IMGN0001");
- Header.OffsetToFirstSlice = 1024;
- Header.SliceBytes = (long)Header.number_of_columns *
- Header.number_of_rows * sizeof(short) +
- sizeof(struct ImagineSliceHeader);
- Header.number_of_frames = 1;
- Header.column_scale = 2.16;
- Header.row_scale = 2.16;
- Header.slice_scale = 14.7;
- Header.frame_scale = 1.0;
- Header.column_units[0] = 0;
- Header.row_units[0] = 0;
- Header.slice_units[0] = 0;
- Header.frame_units[0] = 0;
- Header.image_units[0] = 0;
- Header.Xsection.left =
- Header.Xsection.right =
- Header.Xsection.top =
- Header.Xsection.bottom = 0;
-
- SliceHeader.OffsetToFirstSlice = sizeof(struct ImagineSliceHeader);
- SliceHeader.SliceScale = 1.0;
-
- for( i = 0; i < 1024; i++ ) Blank[i] = 0;
- count_out = 1024;
- if( FSWrite(File_out, &count_out, &Blank) != noErr ) {SysBeep(1); return(1);}
- if( SetFPos(File_out, fsFromStart, 0L) != noErr ) {SysBeep(1); return(1);}
- count_out = sizeof(struct ImagineHeader);
- if( FSWrite(File_out, &count_out, &Header) != noErr ) {SysBeep(1); return(1);}
- if( SetFPos(File_out, fsFromStart, 1024) != noErr ) {SysBeep(1); return(1);}
-
- count_out = (long)Header.number_of_columns*
- (long)Header.number_of_rows;
- if( image_type != 0 ) count_out *= 2L;
- Data_in_char = (unsigned char*)(Data_in = (unsigned short*)NewPtr((Size)(count_out)));
- Data_out = (short*)NewPtr((Size)(count_out*2L));
- if(Data_in == 0L || Data_out == 0L) {SysBeep(1); return;}
- for( slice = 0; slice < Header.number_of_slices; slice++ )
- {
- if( Multi || (!Multi && slice == 0) )
- {
- fn[0] = 0;
- while(!OldFile( &fn, &vRef, &type ));
- if( FSOpen( &fn, vRef, &File_in ) != noErr) {SysBeep(1); return(1);}
- if( SetFPos( File_in, fsFromStart, offset) != noErr ) {SysBeep(1); return(1);}
- }
- if( FSRead( File_in, &count_out, Data_in) != noErr ) {SysBeep(1); return(1);}
- if( image_type != 0 ) count_out /= 2L;
- if( Uns )
- switch(image_type)
- {
- case 0:
- for( i = 0; i < count_out; i++ ) Data_out[i] = Data_in_char[i];
- break;
- case 1:
- for( i = 0; i < count_out; i++ ) Data_out[i] = Data_in[i]/2;
- break;
- case 2:
- for( i = 0; i < count_out; i++ )
- Data_out[i] = (((Data_in[i]>>8)&0x00FF)+((Data_in[i]<<8)&0xFF00))/2;
- break;
- }
- else
- switch(image_type)
- {
- case 0:
- for( i = 0; i < count_out; i++ ) Data_out[i] = ((char*)Data_in_char)[i];
- break;
- case 1:
- for( i = 0; i < count_out; i++ ) Data_out[i] = ((short*)Data_in)[i];
- break;
- case 2:
- for( i = 0; i < count_out; i++ )
- Data_out[i] = ((((short*)Data_in)[i]>>8)&0x00FF)+((((short*)Data_in)[i]<<8)&0xFF00);
- break;
- }
-
- count_in = sizeof(struct ImagineSliceHeader);
- if( FSWrite(File_out, &count_in, &SliceHeader) != noErr ) {SysBeep(1); return(1);}
-
- count_out *= 2L;
- if( FSWrite(File_out, &count_out, Data_out) != noErr ) {SysBeep(1); return(1);}
- if( Multi ) FSClose(File_in);
- }
- DisposPtr(Data_in);
- DisposPtr(Data_out);
- FSClose(File_out);
- return(0);
- }
-
- NewFile( fn, vRef )
- Str255 *fn;
- int *vRef;
- {
- SFPutFile(SFPwhere, "\pNew Image File", fn, 0L, &reply);
- if (reply.good) {
- pStrCopy(reply.fName, fn);
- *vRef = reply.vRefNum;
- return(1);
- }
- else return(0);
- }
-
- OldFile( fn, vRef, type )
- Str255 *fn;
- int *vRef;
- OSType *type;
- {
- SFTypeList myTypes;
-
- myTypes[0]='BINA';
- SFGetFile( SFGwhere, "\pOld Image File", 0L, 0, myTypes, 0L, &reply );
- if (reply.good)
- {
- pStrCopy( reply.fName, fn );
- *vRef = reply.vRefNum;
- *type = reply.fType;
- return(true);
- }
- else return(false);
- }
-
- CreateFile( fn, vRef, theRef )
- Str255 *fn;
- int *vRef;
- int *theRef;
- {
- int io;
-
- io=Create(fn, *vRef, 'IMGN', 'TEXT');
- if ((io==noErr) || (io==dupFNErr)) io = FSOpen( fn, *vRef, theRef );
- return( (io==noErr) || (io=dupFNErr) );
- }
-
- pStrCopy( p1, p2 )
- register char *p1, *p2;
- {
- register int len;
-
- len = *p2++ = *p1++;
- while (--len>=0) *p2++=*p1++;
- }
-